package com.powernode.config;

import com.powernode.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
import org.springframework.security.oauth2.provider.token.TokenEnhancer;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.KeyStoreKeyFactory;

import java.security.KeyPair;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class JwtTokenConfig {

    /**
     * 生成token的转换器，可以指定token的生成方式（jwt的格式）和对jwt进行签名
     */
    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter tokenConverter = new JwtAccessTokenConverter();
        // 设置密钥对，对jwt进行签名
        tokenConverter.setKeyPair(keyPair());
        return tokenConverter;
    }

    /**
     * 从密钥库获取公钥和私钥
     */
    @Bean
    public KeyPair keyPair() {
        // 从证书文件(密钥库)jwt.jks中获取密钥对(公钥和私钥)   jks(java key store)密钥库
        // 认证服务器使用私钥对token进行加签，提供公钥获取接口供资源服务器使用公钥进行验签
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"),"123456".toCharArray());

        return keyStoreKeyFactory.getKeyPair("jwt","123456".toCharArray());
    }


    /**
     * jwt token中扩展的信息
     */
    @Bean
    public TokenEnhancer jwtTokenEnhancer() {
        return (token,authentication)->{
            Map<String,Object> info = new HashMap<>();
            User user = (User) authentication.getUserAuthentication().getPrincipal();
            // 扩展一个id
            info.put("id", user.getId());
            // 扩展一个mobile
            info.put("mobile", user.getMobile());
            ((DefaultOAuth2AccessToken)token).setAdditionalInformation(info);
            return token;
        };
    }

}
